import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * clase IrritanteWorld
 * 
 * @author  rolando delgado salcedo
 * @version version1
 */
public class IrritanteWorld extends World
{
    /**
     * opcion sirve para manipular el menu del juego
     * Nvidas es la variable de tipo entero para las vidad
     * Cont vida es el objeto que muestra el numero de vidas
     * nivel el la variable tipo entero que indica el nivel
     * BandNivel es la bandera que indica si el nivel 
     */
    private int opcion=-1;
    private int Nvidas;
    private Cont vida;
    private int nivel;
    private boolean bandNivel=false;
    /**
     * constructor de la clases irittanteWorld
     */
    
    public IrritanteWorld()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        
        super(800, 600, 1); 
        vida= new Cont();//se inicializa un nuevo objeto
        Nvidas=5;//se inicializa vidas con 5
        nivel=1;//empieza en el nivel 1
        vida.actualiza(Nvidas);//se manda a llamar al metodo actuliza para que aparezca en pantalla el numero de vidas
        prepare();//se manda a llamar el metodo prepare que muestra el menu
       
    }
    
    public void act()
    {
        if(opcion>-1)//opcion para saber si se presiono un boton
        {
            eliminaObjetos();//metodo que elimina todos los objetos
            switch(opcion)
            {
                case 0:
                    super.setBackground("portada.png");//muestra la imagen de la portada
                    prepare();//manda llamar el metodo prepare
                    break;
                case 1:
                      NVL1();//manda a llamar al metodo nivel 1
                      break;
                 case 2:
                    super.setBackground("creditos.png");//muestra imagen de creditos
                    super.addObject(new Regresar(),637,550);//agraga un nuevo objeto que es un boton para regresar al menu
                    break;
                 case 3:
                    super.setBackground("ayuda.png");//muestra imgen de ayuda
                    super.addObject(new Regresar(),118,294);
                    break;
            }
            
                opcion=-1;//regresa opcion a menos 1 para que escoja un boton
        }
        if( nivel == 2 )
        {
            /**
             * elimina los objetos
             * bandera de nivel para saber que tiene que comer
             * manda llamar el metodo nivel dos
             */
            if(!bandNivel)
            {
              eliminaObjetos();  
              bandNivel=true;  
              NVL2();
            }
        }
        if(nivel == 3)
        {
            /**
             * elimina los objetos
             * bandera de nivel para saber que tiene que comer
             * manda llamar el metodo nivel tres
             */
            if(!bandNivel)
            {
              eliminaObjetos();  
              bandNivel=true;  
              NVL3();
            }
        }
        GameOver();
    }
    /**
     * metodo que prepara el menu
     */
    private void prepare()
    {
        /**
         * inicializa un nuevo objeto de tipo mjugar que es un boton para inicial el juego
         * se inicializa las vidas Nvidas a 5
         * el nivel se inicializa en el primero
         * Vida.actuliza muestra el numero de vidas y es un metodo
         * agrega el objeto mjugar que es un boton
         * inicializa un objeto Mcreditos y lo agrega
         * inicializa un objeto Mayuda que es un boton y lo agrega
         * 
         */
        MJugar mjugar = new MJugar();
        Nvidas=5;
        nivel=1;
        vida.actualiza( Nvidas );
        addObject(mjugar, 231, 121);
        MCreditos mcreditos = new MCreditos();
        addObject(mcreditos, 223, 509);
        MAyuda mayuda = new MAyuda();
        addObject(mayuda, 656, 294);
        mayuda.setLocation(648, 129);
        mayuda.setLocation(650, 110);
    }
    /**
     * metodo que cambia de opcion 
     * @op variable que recipo de tipo entero para cambiar de opcion
     */
    public void cambiaOpcion(int op)
    {
        opcion=op;//opcion cambia a op
    }
    /**
     * metodo que elimina todos los objetos
     */
    public void eliminaObjetos()
    {
        super.removeObjects(getObjects(null));//elimina todos los objetos
    }
    /**
     * metodo que muestra la pantalla de perdiste o ganaste
     */
    public void GameOver()
    {
        if(Nvidas<0){//si tus vidas menor a 0 perdiste
           super.addObject(new Fin(),400,214);//agrega un objeto de la clase fin
           Greenfoot.delay(120);//pequeño retardo de imagen
           eliminaObjetos();//elimina los objetos
           
           opcion=0;//opcion la reinicia para poder volver a jugar
        }
        if(nivel==4)//si pasaste de nivel 3 ganas
        {
           eliminaObjetos();//elimina los objetos
           super.setBackground("gano.png");//muestra imagen que gano
           Greenfoot.delay(80);//retardo
           opcion=0;//opcion la reinicia para poder volver a jugar
        }   
    }
    /**
     * /metodo que resta una vida
     */
    public void restaVidas()
    {
        Nvidas=Nvidas-1;
        vida.actualiza( Nvidas );//actualiza el letrero de la pantalla
    }
    /**
     * metodo que sube de nivel
     */
    public void subeNivel()
    {
        /**
         * nivel aumenta
         * reinicia bandera para que pueda comer
         */
        nivel=nivel+1;
        bandNivel=false;
    }
    /**
     * metodo de nivel 1
     */
    public void NVL1()
    {
        /**
         * pone imagen de dondo
         * agrega todos los objetos
         */
        super.setBackground("fondo 1.png");
        super.addObject(new Jugador(),120,200);
        super.addObject(vida,790,10);
        super.addObject(new Letrero("VIDAS"), 730,10);
        super.addObject(new Horizontal(), 247,213);
        super.addObject(new Horizontal(), 248,280);
        super.addObject(new Horizontal(), 552,246);
        super.addObject(new Horizontal(), 552,316);
    }
    /**
     * metodo de nivel 2
     */
    public void NVL2()
    {
        /**
         * variable i de auxiliar para numero de objetos
         * x y y para la posicion
         * se agrega nuevo objeto vida
         * se agrega nuevo objeto letrero
         * se agrega nuevo objeto jugador 
         */
        int i,x=215,y=371;
        super.setBackground("fondo 2.png");
        super.addObject(vida,790,10);
        super.addObject(new Letrero("VIDAS"), 730,10);
        super.addObject(new Jugador(),100,280);
        /**
         * ciclo para agregar los objetos vertical
         */
        for(i=1;i<7;i++)
        {
           super.addObject(new Vertical(), x,y);
           x=x+67;
        }    
        /**
         * actualiza la nueva posicion de los objetos
         */
        y=196;
        x=245;
        for(i=1;i<7;i++)
        {
           super.addObject(new Vertical(), x,y);
           x=x+67;
        }
        super.addObject(new Food(), 400,285);//objeto comida
    }
    /**
     * metodo del nivel 3
     */
    public void NVL3()
    {
        /**
         * x, y, xg, yg, i , j y tam auxiliares para generar los objetos en la posicion correcta
         * se agregan todos los objetos como en el nivel dos
         */
        int x=249,y=165,xg=249,yg=165,tam=20,i,j;
        super.setBackground("fondo 4.png");
        super.addObject(vida,790,10);
        super.addObject(new Letrero("VIDAS"), 730,10);
        super.addObject(new Jugador(),135,135);
        super.addObject(new Food(),176,310);
        super.addObject(new Food(),315,310);
        super.addObject(new Food(),453,310);
        for(j=0;j<2;j++)
        {
            for(i=0;i<3;i++)
            {
                super.addObject(new Circular(xg,yg), x,y);
                super.addObject(new Circular(xg,yg), x-tam,y-tam);
                super.addObject(new Circular(xg,yg), x+tam,y-tam);
                super.addObject(new Circular(xg,yg), x-tam,y+tam);
        
                super.addObject(new Circular(xg,yg), x-2*tam,y-2*tam);
                super.addObject(new Circular(xg,yg), x+2*tam,y-2*tam);
                super.addObject(new Circular(xg,yg), x-2*tam,y+2*tam);
             
                x=x+6*tam+13;
                xg=x;
            }
            y=368;
            x=xg=249;
            yg=y;
        }
    }
    /**
     * metodo que da el nivel @return regresa e nivel
     */
    public int dameNivel()
    {
        return nivel;
    }
}
